(一)nRF52 Binky 例程分析

除非注明,本站博客均为原创或翻译,转载请务必注明出处并保留原文链接:文章来源于喵兄研发日记


[TOC]


工程简介

​ Noridc官方提供了多种开发环境下的例程,首先选择评估板的型号,比如我的是pca10040,再选择自己要用的开发环境,此处选择的环境是Keil4,因此本文的例程路径如图所示:

QQ截图20170217113148

​ 简单说明一下,blinky\ 目录下的blinky.eww为IAR工程,blinky\pca10040\下有两个文件夹blank和s132,一个不包含软设备库,一个包含,在此Demo中任选一个皆可。例如blank下又有众多工程配置,根据自己的开发工具选择即可。

代码分析

​ 首先看一下对引脚的定义,评估板上有四个LED灯,分别为引脚17、18、19、20,nRF52引脚不像常用的STM32那样,有端口和引脚号的概念,其素有的引脚都可以独立访问,并灵活的配置映射到某个功能模块上。因此,四个引脚的定义就是这么简单:

QQ截图20170217132043

​ 接下来看一下主程序,line37行将四个引脚配置为输出,line44依次翻转各个引脚的状态,line45是软件延时,里面死循环执行汇编指令。

QQ截图20170217132350

​ 对于引脚的翻转,Nordic的设计还有点意思,可以分析一下。首先明确:OUTSET及OUTCLR寄存器只对写1操作有效,写0被忽视了。

QQ截图20170217132733

​ 在line64中,变量gpio_state获取了当前所有输出引脚的位状态(0或1)。在line65中,先对变量gpio_state的所有状态位进行了翻转,因此那些先前复位(灯灭)的位,此时的变量值被设定为1,然后再对leds_mask位处的值进行了&1的运算,其余不相干位都是&0运算,也就是说:除了leds_mask位,其余所有位都为0,对OUTSET寄存器来说,写0没有影响。接着判断leds_mask位,如果该位的实际引脚输出为0(灯灭),变量翻转后为1,&1以后为1,则将该引脚置位(点亮);如果该位的引脚输出为1(灯本来就是亮的),变量位翻转后为0,&1为0,则灯保持不变。因此本行代码的作用就是:对于leds_mask位,如果灯本来是灭的,将其点亮,状态位0->1;如果灯本来是亮的,不管它。

​ 再看line65行,对gpio_state进行了与运算,除了leds_mask位需要计算,其余位运算后都为0,因此要改变的也只有可能是leds_mask位。接下来判断leds_mask位,如果该位的gpio_state值为0(其实是line64之前的状态,灯本来是灭的),则&1运算后,是0,无影响;如果该位的gpio_state值为1(灯本来是亮的),则&1运算后,是1,将该位写1,清除输出。因此本行代码的作用就是:对于leds_mask位,如果灯本来是灭的,不管它;如果灯本来是亮的,将其熄灭,状态位1->0。

Liu Lu wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章